package com.imooc.sell.service;

import com.imooc.sell.dataobject.OrderDetail;
import com.imooc.sell.dataobject.OrderMaster;
import com.imooc.sell.dataobject.User;
import com.imooc.sell.dto.CartDTO;
import com.imooc.sell.dto.OrderDTO;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * 订单业务类接口
 */
public interface OrderService {
    /**
     * 获取用户基本信息
     *
     * @param openid 用户openid
     * @return User 用户对象
     * @author wang
     */
    User getUserBaseInfo(String openid);

    /**
     * 提交订单(创建订单)
     *
     * @param orderDTO 数据传输对象
     * @return 数据传输对象
     * @author wang
     */
    OrderDTO orderSave(OrderDTO orderDTO);

    /**
     * 减少库存
     *
     * @param cartDTOList 购物车列表
     * @author wang
     */
    @Transactional
    void reduceStock(List<CartDTO> cartDTOList);

    /**
     * 买家取消订单
     *
     * @param orderDTO 数据传输对象
     * @return 数据传输对象
     * @author wang
     */
    OrderDTO cancel(OrderDTO orderDTO);

    /**
     * 增加库存
     *
     * @param cartDTOList 购物车列表(订单详情列表，但是只有productId和quantity属性)
     */
    @Transactional
    void increaseStock(List<CartDTO> cartDTOList);

    /**
     * 退款
     *
     * @param orderId 订单id
     * @return OrderDTO 返回数据传输对象
     * @author wang
     */
    OrderDTO payBack(String orderId);

    /**
     * 支付(修改支付状态)
     *
     * @param orderId 订单id
     * @return OrderDTO 返回数据传输对象
     * @author wang
     */
    OrderDTO paid(String orderId);

    /**
     * 查询单个订单
     *
     * @param orderId 订单号
     * @return OrderDTO 返回数据传输对象
     * @author wang
     */
    OrderDTO findOneOrder(String orderId);

    /**
     * 返回一个orderMaster
     *
     * @param orderId 订单id
     * @return 返回一个orderMaster
     */
    OrderDTO findOneOrderMaster(String orderId);

    /**
     * 根据订单状态分类 查询订单
     *
     * @param openid   用户openid
     * @param pageable 分页对象
     * @return Page<OrderDTO> 数据传输的分页对象（本质上是OrderMaster对象,因为详情列表为空）,因为此时不需要详情，只需显示订单列表即可
     * @author wang
     */
    Page<OrderDTO> findOrderList(String openid, Pageable pageable);

    /**
     * 根据orderId获取订单详情
     *
     * @param orderId 订单id
     * @return 指定订单的订单详情列表
     */
    List<OrderDetail> findDetailList(String orderId);

    /**
     * 根据用户openid查询其所有订单
     *
     * @param openid 用户id
     * @return 用户所有的订单
     */
    List<OrderDTO> findAllOrderListByOpenid(String openid);

    /*******************************卖家端接口********************************/

    /**
     * 卖家取消订单
     *
     * @param orderId 订单id
     * @return 数据传输对象
     */
    OrderDTO sellerCancel(String orderId);

    /**
     * 用户申请退款之后，商家对退款申请进行决断
     *
     * @param orderId 订单id
     * @param isAgree 商家是否同意
     * @return 数据传输对象
     */
    OrderDTO agreePayBack(String orderId, boolean isAgree);

    OrderDTO agreePayBack2(String orderId, boolean isAgree);

    /**
     * 按时间顺序分页查询商家所有订单
     *
     * @return
     */
    Page<OrderDTO> findPayingBackOrderList(Pageable pageable);

    /**
     * 通过订单状态查询在日期范围内的订单，并按时间顺序排序
     *
     * @param orderStatus 订单状态
     * @param startDate   开始时间
     * @param endDate     结束时间
     * @param pageable    分页对象
     * @return
     */
    Page<OrderDTO> findAllByOrderStatusAndCreateTimeBetweenOrderByCreateTime(Short orderStatus, Date startDate, Date endDate, Pageable pageable);
}
